package com.wei.czz.framework.store.controller;

import java.util.Objects;

import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.store.account.AccountEnumDto;
import com.wei.czz.common.enums.CommonEnum;
import com.wei.czz.common.jsr303.group.Submit;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.common.vo.store.StoreAccountVo;
import com.wei.czz.framework.store.manager.StoreAccountManager;
import com.wei.czz.framework.store.service.StoreAccountService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 商店账户表
 *
 * @author wei
 * email 945158190@gmail.com
 * date 2023-11-22 17:44:15
 */
@RestController
@RequestMapping("/store-account")
@AllArgsConstructor
public class StoreAccountController {

    private static final Logger log = LoggerFactory.getLogger(StoreAccountController.class);

    private final StoreAccountManager storeAccountManager;

    private final StoreAccountService storeAccountService;

    /**
     * 保存商店账户接口
     * <p>
     * 此接口会校验是否重复提交
     * @param storeAccountVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "保存商店账户")
    @PostMapping("/save")
    public Result<Object> saveStoreAccount(@Validated({Submit.class}) @RequestBody StoreAccountVo storeAccountVo){
        log.info("开始保存商店账户业务。{}", storeAccountVo);

        if (Objects.isNull(storeAccountVo.getStoreId())) {
            log.info("参数传递的商店主键为空");
            return Result.clientFail("商店主键不能为空");
        }
        Result<Object> result = this.checkStoreAccount(storeAccountVo);
        if (Objects.nonNull(result)) {
            return result;
        }
        if (Objects.isNull(storeAccountVo.getSort())) {
            log.info("参数传递的序号为空");
            return Result.clientFail("序号不能为空");
        }

        storeAccountManager.saveStoreAccount(storeAccountVo);

        log.info("保存商店账户业务结束");
        return Result.success();
    }

    /**
     * 获取商店账户枚举接口
     * @param id      主键
     * @param storeId 商店主键
     * @return 结果
     */
    @GetMapping("/enums")
    public Result<AccountEnumDto> getStoreAccountEnums(@RequestParam(value = "id", required = false) Long id,
                                                       @RequestParam("storeId") Long storeId) {
        log.info("开始获取商店账户枚举业务。id={} storeId={}", id, storeId);

        AccountEnumDto accountEnumDto = storeAccountManager.getStoreAccountEnums(id, storeId);

        log.info("获取商店账户枚举业务结束");
        return Result.success(accountEnumDto);
    }

    /**
     * 修改商店账户接口
     * <p>
     * 此接口会校验是否重复提交
     * @param storeAccountVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "修改商店账户")
    @PostMapping("/update")
    public Result<Object> updateStoreAccount(@Validated(Update.class) @RequestBody StoreAccountVo storeAccountVo) {
        log.info("开始修改商店账户业务。{}", storeAccountVo);

        Result<Object> result = this.checkStoreAccount(storeAccountVo);
        if (Objects.nonNull(result)) {
            return result;
        }
        if (Objects.isNull(storeAccountVo.getSort())) {
            log.info("参数传递的序号为空");
            return Result.clientFail("序号不能为空");
        }

        storeAccountManager.updateStoreAccount(storeAccountVo);

        log.info("修改商店账户业务结束");
        return Result.success();
    }

    /**
     * 修改商店账户状态接口
     * @param updateStatusVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "修改商店账户状态")
    @PostMapping("/update/status")
    public Result<Object> updateStoreAccountStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始修改商店账户状态业务。{}", updateStatusVo);

        storeAccountService.updateStoreAccountStatus(updateStatusVo);

        log.info("修改商店账户状态业务结束");
        return Result.success();
    }

    /**
     * 删除商店账户操作
     * <p>
     * 此接口会校验是否重复提交
     * @param id 主键
     * @return 结果
     */
    @Resubmit(message = "删除商店账户")
    @DeleteMapping("/delete")
    public Result<Object> deleteStoreAccount(@RequestParam("id") Long id) {
        log.info("开始删除商店账户业务。id={}", id);

        storeAccountManager.deleteStoreAccount(id);

        log.info("删除商店账户业务结束");
        return Result.success();
    }

    /**
     * 校验商店账户
     * @param storeAccountVo 商店账户参数对象
     * @return 校验结果
     */
    private Result<Object> checkStoreAccount(StoreAccountVo storeAccountVo) {
        if (CommonEnum.ZERO.getValue().equals(storeAccountVo.getType())) {
            // 对公
            if (StringUtils.isBlank(storeAccountVo.getEnterpriseName())) {
                log.info("账户企业名称不能为空");
                return Result.fail("账户企业名称不能为空");
            }
            if (StringUtils.isBlank(storeAccountVo.getEnterpriseNo())) {
                log.info("账户企业社会统一信用代码不能为空");
                return Result.fail("账户企业社会统一信用代码不能为空");
            }
        } else {
            // 对私
            if (StringUtils.isBlank(storeAccountVo.getName())) {
                log.info("账户名称不能为空");
                return Result.fail("账户名称不能为空");
            }
            if (StringUtils.isBlank(storeAccountVo.getIdCard())) {
                log.info("账户身份证号不能为空");
                return Result.fail("账户身份证号不能为空");
            }
        }
        return null;
    }

}
